python-闭包函数和装饰器
闭包函数
什么是闭包?
函数的内部函数,对外部作用域,而非全局作用域的引用。
可以打破层级关系,把局部变量拿到全局使用,并且可以把外部的变量x封装到f2中,然后下车直接调用f2就行了。
x = 10
def f1(x): # f1()== f2
# x = 2
def f2():
print(x)
return f2 # 把f2函数当做一个返回值返回给f1.
f2 =f1(1) # f1()就相当于把f2的值拿到,然后在赋值给一个变量名为f2。
f2()
1
全局中相同名字的变量不会影响局部的变量。
两种为函数传参的方式
使用参数的形式
def f1(x):
print(x)
f1(1)
1
包给函数
def f1(x):
def f2():
print(x)
return f2
f = f1(2)
f()
2
闭包函数的应用
闭包的意义:
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹一层作用域,这使得,该函数无论在何处调用,都优先使用自己外层包裹的作用域。
应用领域:延迟计算、爬虫领域。
import requests
def outter(url): #outter() == spider ;spider() == response == requests.get(url)
def spider(): # spider() == response
response = requests.get(url)
print(response.status_code)
return response
return spider
baidu = outter('https://www.baidu.com') # baidu == spider
baidu()
200
装饰器
无参装饰器
什么是装饰器
是为被装饰器对象添加额外功能。装饰器本质上也是一个函数,只不过这个函数具有装饰的功能。
为什么要用装饰器
当我们想新增功能,但又不想修改原方法的使用方法,这个时候就可以使用装饰器。
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不修改被装饰对象的调用方式
怎么用装饰器
import time
def time_sleep():
time.sleep(1)
print('from time_sleep')
def deco(func): # deco()== wrapper ; func == time_sleep
def wrapper():
start = time.time()
res = func()
end = time.time()
print(end - start)
return res
return wrapper
time_sleep = deco(time_sleep) #func == time_sleep ,括号里的time_sleep才是调用上面函数time_sleep,而前面的time_sleep只是我们自定义的一个接收变量值的变量名。
time_sleep() # time_sleep() == wrapper()
from time_sleep
1.000948429107666
完善装饰器
返回值的
import time
def time_sleep():
time.sleep(1)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep() # wrapper()
print(res)
1.0001847743988037
longzeluola
参数的
import time
def time_sleep(x): #给定义了一个形参
time.sleep(x)
return 'longzeluola'
def deco(func):
def wrapper(*args,**kwargs):
start = time.time()
res = func(*args,**kwargs)
end = time.time()
print(end - start)
return res
return wrapper ##wrapper() == res == func()
time_sleep = deco(time_sleep) #wrapper
res = time_sleep(3) # wrapper()
print(res)
3.00034236907959
longzeluola
装饰器模板
def deco(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
return res
return wrapper
语法糖
import time
@deco # @deco == time_sleep == deco(time_sleep)
def time_sleep(x):
time.sleep(x)
return 'longzeluola'
time_sleep(5)
5.000701427459717